#include "EpilTokenStream.h"
#include "EpilParserException.h"


EpilTokenStream::EpilTokenStream( const list<EpilToken> & tokens )
: m_tokens( tokens )
{
	m_curTokenIter = tokens.begin();
}


EpilTokenStream::~EpilTokenStream()
{
}


const EpilToken & EpilTokenStream::GetPreviousToken( int count ) const
{
	list<EpilToken>::const_iterator it = m_curTokenIter;
	for( int i = 0; i < count; i++ )
	{
		--it;
	}

	return *it;
}


const EpilToken & EpilTokenStream::PeekNextToken( int count ) const
{
	list<EpilToken>::const_iterator it = m_curTokenIter;
	
	try
	{
		advance( it, count );
	}
	catch( const exception & )
	{
		throw EpilParserException( t("Unexpected end of file."), it->location );
	}

	return *it;
}


void EpilTokenStream::MoveToNext()
{
	++m_curTokenIter;
}


bool EpilTokenStream::IsReachEnd() const
{
	return m_curTokenIter == m_tokens.end();
}